package com.wly.login.user.factory;

import com.wly.login.user.strategy.LoginStrategy;
import lombok.Getter;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;


/**
 * 管理和获取不同的登录策略
 *
 * @author wly
 */
@Component
// @Component 将该类标记为 Spring 的一个组件，Spring 会自动扫描并管理它的生命周期。
public class LoginStrategyManager implements BeanPostProcessor {

    // 存储所有登录策略，键：登录类型，值： LoginStrategy 实现类。
    @Getter
    private static final Map<String, LoginStrategy> loginStrategyMap = new HashMap<>();


    public static LoginStrategy getLoginStrategy(String loginType) {
        return loginStrategyMap.get(loginType);
    }


    // 多增加一个策略，自动存入loginStrategyMap中，不用手动补充代码
    @Override
    public Object postProcessBeforeInitialization(@NonNull Object bean, @NonNull String beanName) throws BeansException {
        // 检查当前 Bean 是否是 LoginStrategy 的实例。
        if (bean instanceof LoginStrategy strategy) {
            //如果是，则调用 strategy.loginType() 方法获取登录类型，并将该策略存入 loginStrategyMap 中。
            loginStrategyMap.put(strategy.loginType(), strategy);
        }
        //最后返回原始的 Bean。
        return bean;
    }
}
/** 它通过 Spring 的 BeanPostProcessor 接口，在 Spring 容器初始化 Bean 的过程中，
 自动收集所有实现了 LoginStrategy 接口的 Bean，并将它们存储到一个静态的 Map 中 */

